/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.mindbox.mueblesalpes.negocio.persistence;

import com.mindbox.mueblesalpes.negocio.entity.Color;
import com.mindbox.mueblesalpes.negocio.entity.Dimension;
import com.mindbox.mueblesalpes.negocio.entity.Mueble;
import com.mindbox.mueblesalpes.negocio.entity.MuebleInventario;
import com.mindbox.mueblesalpes.negocio.entity.TipoMueble;
import java.util.ArrayList;
import java.util.List;

/**
 * Clase que implementa la persistencia del producto
 * @author Catalina Soto Zuluaga
 */
public class ProductoMock implements IProductoMock {

    private static List<Mueble> listMuebles;
    private static List<MuebleInventario> listProductos;

    static{
        listProductos = new ArrayList<MuebleInventario>();
        listMuebles = new ArrayList<Mueble>();
        listMuebles = inicializarDatos();
    }

    public ProductoMock() {       
    }

    public List<Mueble> consultarMuebles() {
        return listMuebles;
    }

    /**
     * Método que retorna los muebles registrados en el sistema
     * @param mueble
     * @return List<Mueble> listaMuebles
     */
    public List<Mueble> consultarMueble(Mueble mueble) {

        List<Mueble> listResult = new ArrayList<Mueble>();

        if (mueble.getReferencia() != null && !mueble.getReferencia().equals("")) {
            for (Mueble muebleTemp : listMuebles) {
                if (muebleTemp.equals(mueble)) {
                    listResult.add(muebleTemp);
                }
            }
        } else if (mueble.getNombre() != null && !mueble.getNombre().equals("")) {
            for (Mueble muebleTemp : listMuebles) {
                if (muebleTemp.getNombre().contains(mueble.getNombre())) {
                    listResult.add(muebleTemp);
                }
            }
        } else if (mueble.getTipoMueble() != null) {
            for (Mueble muebleTemp : listMuebles) {
                if (muebleTemp.getTipoMueble().equals(mueble.getTipoMueble())) {
                    listResult.add(muebleTemp);
                }
            }
        } else {
            return listMuebles;
        }

        return listResult;
    }

    /**
     * Método que retorna el inventario de productos
     * @return List<MuebleInventario>
     */
    public List<MuebleInventario> consultarInventarioProductos() {

        MuebleInventario inventario1 = new MuebleInventario();
        MuebleInventario inventario2 = new MuebleInventario();
        MuebleInventario inventario3 = new MuebleInventario();
        MuebleInventario inventario4 = new MuebleInventario();

        inventario1.setMueble(listMuebles.get(0));
        inventario1.setCantidad(5);
        inventario1.setPrecio(new Double(135000));

        inventario2.setMueble(listMuebles.get(1));
        inventario2.setCantidad(10);
        inventario2.setPrecio(new Double(100000));

        inventario3.setMueble(listMuebles.get(2));
        inventario3.setCantidad(25);
        inventario3.setPrecio(new Double(80000));

        inventario4.setMueble(listMuebles.get(3));
        inventario4.setCantidad(14);
        inventario4.setPrecio(new Double(176000));

        listProductos.add(inventario1);
        listProductos.add(inventario2);
        listProductos.add(inventario3);
        listProductos.add(inventario4);

        return listProductos;
    }

    /**
     * Método que iniciliza los datos en el sistema
     * @return List<Mueble> listaMuebles
     */
    private static List<Mueble> inicializarDatos() {

        //Se crea el objeto dimension con sus caracteristicas
        Dimension dimension1 = new Dimension();
        dimension1.setAlto(new Double(140));
        dimension1.setAncho(new Double(40));
        dimension1.setProfundidad(new Double(55));

        Dimension dimension2 = new Dimension();
        dimension2.setAlto(new Double(100));
        dimension2.setAncho(new Double(30));
        dimension2.setProfundidad(new Double(45));

        Dimension dimension3 = new Dimension();
        dimension3.setAlto(new Double(120));
        dimension3.setAncho(new Double(45));
        dimension3.setProfundidad(new Double(65));

        Dimension dimension4 = new Dimension();
        dimension4.setAlto(new Double(120));
        dimension4.setAncho(new Double(30));
        dimension4.setProfundidad(new Double(78));

        Mueble mueble1 = new Mueble();
        mueble1.setReferencia("MESONAT001");
        mueble1.setNombre("Mesa Ovalada estilo griego");
        mueble1.setDescripcion("Mesa ovalada con un elegante estilo griego");
        mueble1.setTipoMueble(TipoMueble.INTERIOR);
        mueble1.setMaterial("Madera");
        mueble1.setDimension(dimension1);
        mueble1.setColor(Color.NATURAL);
        mueble1.setPeso(new Double(30));
        mueble1.setFoto("/img/productos/mueble1.jpg");

        Mueble mueble2 = new Mueble();
        mueble2.setReferencia("MESONAT002");
        mueble2.setNombre("Mesa Ovalada estilo ruso");
        mueble2.setDescripcion("Mesa ovalada con un elegante estilo ruso");
        mueble2.setTipoMueble(TipoMueble.INTERIOR);
        mueble2.setMaterial("Madera");
        mueble2.setDimension(dimension2);
        mueble2.setColor(Color.CAOBA);
        mueble2.setPeso(new Double(30));
        mueble2.setFoto("/img/productos/mueble2.jpg");

        Mueble mueble3 = new Mueble();
        mueble3.setReferencia("MESONAT003");
        mueble3.setNombre("Mesa Ovalada estilo americano");
        mueble3.setDescripcion("Mesa ovalada con un elegante estilo americano");
        mueble3.setTipoMueble(TipoMueble.EXTERIOR);
        mueble3.setMaterial("Madera");
        mueble3.setDimension(dimension1);
        mueble3.setColor(Color.AVELLANA);
        mueble3.setPeso(new Double(30));
        mueble3.setFoto("/img/productos/mueble3.jpg");

        Mueble mueble4 = new Mueble();
        mueble4.setReferencia("MESOAVE004");
        mueble4.setNombre("Mesa Ovalada estilo argentino");
        mueble4.setDescripcion("Mesa ovalada con un elegante estilo argentino");
        mueble4.setTipoMueble(TipoMueble.EXTERIOR);
        mueble4.setMaterial("Madera");
        mueble4.setDimension(dimension1);
        mueble4.setColor(Color.WENGUE);
        mueble4.setPeso(new Double(30));
        mueble4.setFoto("/img/productos/mueble4.jpg");

        listMuebles.add(mueble1);
        listMuebles.add(mueble2);
        listMuebles.add(mueble3);
        listMuebles.add(mueble4);

        return listMuebles;
    }

    /**
     * Método que elimina un producto del sistema
     * @param mueble
     * @return true - Si elimina exitosamente el producto, false no elimina el producto
     */

    public boolean eliminarProducto(Mueble mueble) {
        boolean result = false;
        Mueble muebleTemp = new Mueble();
        for (int i = 0; i < listMuebles.size(); i++) {
            muebleTemp = listMuebles.get(i);
            if (muebleTemp.equals(mueble)) {
                listMuebles.remove(i);
                result = true;
            }
        }

        MuebleInventario muebleInv = new MuebleInventario();
        for (int i = 0; i < listProductos.size(); i++) {
            muebleInv = listProductos.get(i);
            if (muebleInv.getMueble().equals(mueble)) {
                if (muebleInv.getCantidad() > 0) {
                    listProductos.get(i).setCantidad(muebleInv.getCantidad() - 1);
                }
            }
        }
        return result;
    }

    /**
     * Método que inserta un producto en el sistema
     * @param mueble
     * @return true si lo inserta exitosamente, false si no logra eliminar el producto en el sistema
     */
    public boolean insertarProducto(Mueble mueble) {
        listMuebles.add(mueble);
        return true;
    }

    /**
     * Método que permite editar el inventario de productos en el sistema
     * @param muebleInventario
     * @return true si editar el inventario exitosamente, false si no logra editar el producto.
     */
    public boolean editarProductoInventario(MuebleInventario muebleInventario) {
        MuebleInventario muebleInv = new MuebleInventario();

        for (int i = 0; i < listProductos.size(); i++) {
            muebleInv = listProductos.get(i);
            if (muebleInv.getMueble().equals(muebleInventario.getMueble())) {
                listProductos.get(i).setCantidad(muebleInventario.getCantidad());
                listProductos.get(i).setPrecio(muebleInventario.getPrecio());
            }
        }
        return true;
    }

    /**
     * Método que permite editar un productos en el sistema
     * @param mueble
     * @return true si editar el producto exitosamente, false si no logra editar el producto.
     */
    public boolean editarProducto(Mueble mueble) {
        Mueble muebleTemp = new Mueble();

        for (int i = 0; i < listMuebles.size(); i++) {
            muebleTemp = listMuebles.get(i);
            if (muebleTemp.equals(mueble)) {
                listMuebles.set(i, mueble);
            }
        }
        return true;
    }
}
